<?php
/**
 * User: Administrator
 * Time: 2015/11/19 17:17
 */


//1、查看公司内使用的php、webserver版本，确定是否有安全漏洞

//好像没有

//2、自己编写一个防csrf攻击的类（使用memcache存储csrf token）

class Crsf {

	private $memcahe;

	//用户id
	private $id;

	public function __construct(Memcache $memcache, $id) {
		$this->memcahe = $memcache;
		$this->id      = $id;
	}

	/**
	 * 设置token
	 */
	public function set() {
		$token = md5(uniqid(mt_rand(1,10000),1));
		$this->memcahe->set('crsf_token_' . $this->id, $token);
		return $token;
	}

	/**
	 * 检测token
	 * @param $reques_token
	 * @return bool
	 */
	public function check($reques_token) {
		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
			if ($this->get() != $reques_token) {
				return false;
			}
		}
		return true;
	}


	/**
	 * 获取token
	 * @return array|string
	 */
	private function get() {
		return $this->memcahe->get('crsf_token_' . $this->id);
	}

}

$uid = 1;

$memcache_handle = new Memcache();

$crsf = new Crsf($memcache_handle, $uid);

//检测token是否正确
if ($crsf->check($_REQUEST['csrf_token']) == false) {
	throw new ErrorException('crsf_token 验证失败');
}

//设置并分配一个新token
$this->assign('crsf_token',$crsf->set());

//3、写出 false == {} 两边比较时的类型转换过程。

//false 转为 0，
//{} 转为原始值 [object Object],
// [object Object] 转为 NaN,
// 0 == NaN,
// false

//4、找出对象arguments 当中第二大的值，如argsSecondMax(1, 2, 3, 5, 6, 7, 8)返回7。

//function argsSecondMax() {
//	//arguments 转成数组
//	var arr = Array.slice.call(arguments);
//	return arr.sort(function (x, y) {
//		return parseInt(y) - parseInt(x)
//		})[1];
//}
//console.log(argsSecondMax(1, 2, 3, 5, 6, 7, 6, 23));

//5、写一段具有闭包特性的JS代码。

///**
// * 计数器
// * @returns {Function}
// */
//function count(start) {
//	var num = start | 0;
//	return function () {
//		num++;
//		return num;
//	}
//	}
//var counter = count(4);
////每次+1
//console.log(counter()); //1
//console.log(counter()); //2
//console.log(counter()); //3
//console.log(counter()); //4


// 选做题：
//1、测试 http://www.cmall.co.jp/ 是否有web漏洞:)

//没找到

//2、实现图片延迟加载效果。